package com.study.hot.jetpack.lifecycle

import android.os.Bundle
import android.os.SystemClock
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import com.study.hot.R
import com.study.hot.jetpack.lifecycle.use_in_mvp.LifeMvpActivity
import kotlinx.android.synthetic.main.activity_lifecycle.*
import org.jetbrains.anko.sdk27.coroutines.onClick
import org.jetbrains.anko.startActivity

/**
 * <pre>
 *     author : fauks
 *     time   : 2020/03/25
 *     desc   : Activity中使用各种组件，需要在不同的生命周期中处理组件的生命周期，导致Activity非常臃肿
 *              如果组件需要在特定环境下start，导致Activity已经走了onStop才执行组件的start方法造成内存泄漏
 *              Lifecycle则可以通过弹性和隔离的方式解决以上问题
 *
 *
 *     Activity、Fragment中已经实现了LifecycleOwner所以可以直接使用，如果想自定义LifecycleOwner，可以实现LifecycleOwner接口
 * </pre>
 */
// lifecycle 也可以用在App中观察整个应用的生命周期，从而判断应用前后台切换
class LifecycleActivity : AppCompatActivity(), LifecycleOwner {

    lateinit var locListener: LocListener

    // 通过该类注册生命周期
    lateinit var lifecycleRegistry: LifecycleRegistry

    //记录在页面中停留时间，在不使用lifecycle时需要在Activity声明周期处理逻辑，Activity会很臃肿
    var watchTime = 0L

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_lifecycle)

        //将自定义Chronometer添加到生命周期观察者中
        lifecycle.addObserver(customTimeView)
        locListener = LocListener()

        findViewById<Button>(R.id.toMvp).onClick {
            startActivity<LifeMvpActivity>()
        }

        lifecycleRegistry = LifecycleRegistry(this)
        // 标记生命周期
        lifecycleRegistry.currentState = Lifecycle.State.CREATED
    }

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }

    //在当前页面开始记时
    override fun onStart() {
        super.onStart()
        timeView.base = SystemClock.elapsedRealtime() - watchTime
        timeView.start()

        locListener.start()
    }

    //不在当前页面暂停记时
    override fun onStop() {
        super.onStop()
        watchTime = SystemClock.elapsedRealtime() - timeView.base
        timeView.stop()

        locListener.stop()
    }
}